From 8290dc99dcccd0966e2f66cfa94129e0a8d7db76 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sun, 27 Jan 2002 18:39:22 +0000 Subject: [PATCH] add mouse_cursor_obscured. 2002-01-27 Anders Carlsson * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. * gtk/gtktextview.c (set_invisible_cursor): New function. (gtk_text_view_obscure_mouse_cursor): Likewise. (gtk_text_view_key_press_event): Call obscure_cursor if text has been inserted. (gtk_text_view_motion_event): Restore the mouse cursor. * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. (set_invisible_cursor): New function. (gtk_entry_obscure_mouse_cursor): Likewise. (gtk_entry_key_press): call obscure_cursor if text has been inserted. (gtk_entry_motion_notify): Restore the mouse cursor. --- ChangeLog | 18 +++++++++++++ ChangeLog.pre-2-0 | 18 +++++++++++++ ChangeLog.pre-2-10 | 18 +++++++++++++ ChangeLog.pre-2-2 | 18 +++++++++++++ ChangeLog.pre-2-4 | 18 +++++++++++++ ChangeLog.pre-2-6 | 18 +++++++++++++ ChangeLog.pre-2-8 | 18 +++++++++++++ gtk/gtkentry.c | 54 +++++++++++++++++++++++++++++++++++++-- gtk/gtkentry.h | 2 ++ gtk/gtktextview.c | 63 ++++++++++++++++++++++++++++++++++++++++++++-- gtk/gtktextview.h | 2 ++ 11 files changed, 243 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index ec4ec7fc27..29cd5cb42b 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,21 @@ +2002-01-27 Anders Carlsson + + * gtk/gtktextview.h (struct _GtkTextView): add mouse_cursor_obscured. + + * gtk/gtkentry.h (struct _GtkEntry): Add mouse_cursor_obscured. + + * gtk/gtktextview.c (set_invisible_cursor): New function. + (gtk_text_view_obscure_mouse_cursor): Likewise. + (gtk_text_view_key_press_event): Call obscure_cursor if text + has been inserted. + (gtk_text_view_motion_event): Restore the mouse cursor. + + * gtk/gtkentry.c (gtk_entry_realize): Add GDK_POINTER_MOTION_MASK. + (set_invisible_cursor): New function. + (gtk_entry_obscure_mouse_cursor): Likewise. + (gtk_entry_key_press): call obscure_cursor if text has been inserted. + (gtk_entry_motion_notify): Restore the mouse cursor. + 2002-01-27 Sven Neumann * gtk/gtkstyle.c (sanitize_size): removed unused return value. diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 124ab72bd9..bc0dec1766 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -1016,6 +1016,7 @@ gtk_entry_realize (GtkWidget *widget) GDK_BUTTON1_MOTION_MASK | GDK_BUTTON3_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | + GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; @@ -1031,7 +1032,7 @@ gtk_entry_realize (GtkWidget *widget) entry->text_area = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_user_data (entry->text_area, entry); - gdk_cursor_destroy (attributes.cursor); + gdk_cursor_unref (attributes.cursor); widget->style = gtk_style_attach (widget->style, widget->window); @@ -1469,7 +1470,17 @@ gtk_entry_motion_notify (GtkWidget *widget, GtkEntry *entry = GTK_ENTRY (widget); gint tmp_pos; - if (event->window != entry->text_area || entry->button != 1) + if (entry->mouse_cursor_obscured) + { + GdkCursor *cursor; + + cursor = gdk_cursor_new (GDK_XTERM); + gdk_window_set_cursor (entry->text_area, cursor); + gdk_cursor_unref (cursor); + entry->mouse_cursor_obscured = FALSE; + } + + if (event->window != entry->text_area || entry->button !=1) return FALSE; if (event->is_hint || (entry->text_area != event->window)) @@ -1514,6 +1525,44 @@ gtk_entry_motion_notify (GtkWidget *widget, return TRUE; } +static void +set_invisible_cursor (GdkWindow *window) +{ + GdkBitmap *empty_bitmap; + GdkCursor *cursor; + GdkColor useless; + char invisible_cursor_bits[] = { 0x0 }; + + useless.red = useless.green = useless.blue = 0; + useless.pixel = 0; + + empty_bitmap = gdk_bitmap_create_from_data (window, + invisible_cursor_bits, + 1, 1); + + cursor = gdk_cursor_new_from_pixmap (empty_bitmap, + empty_bitmap, + &useless, + &useless, 0, 0); + + gdk_window_set_cursor (window, cursor); + + gdk_cursor_unref (cursor); + + g_object_unref (empty_bitmap); +} + +static void +gtk_entry_obscure_mouse_cursor (GtkEntry *entry) +{ + if (entry->mouse_cursor_obscured) + return; + + set_invisible_cursor (entry->text_area); + + entry->mouse_cursor_obscured = TRUE; +} + static gint gtk_entry_key_press (GtkWidget *widget, GdkEventKey *event) @@ -1527,6 +1576,7 @@ gtk_entry_key_press (GtkWidget *widget, if (gtk_im_context_filter_keypress (entry->im_context, event)) { + gtk_entry_obscure_mouse_cursor (entry); entry->need_im_reset = TRUE; return TRUE; } diff --git a/gtk/gtkentry.h b/gtk/gtkentry.h index 027e838db4..2889d41846 100644 --- a/gtk/gtkentry.h +++ b/gtk/gtkentry.h @@ -88,6 +88,8 @@ struct _GtkEntry guint is_cell_renderer : 1; guint editing_canceled : 1; /* Only used by GtkCellRendererText */ + guint mouse_cursor_obscured : 1; + guint button; guint blink_timeout; guint recompute_idle; diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 10cb65d1e5..1e72cfbd97 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -3485,6 +3485,45 @@ gtk_text_view_direction_changed (GtkWidget *widget, } } + +static void +set_invisible_cursor (GdkWindow *window) +{ + GdkBitmap *empty_bitmap; + GdkCursor *cursor; + GdkColor useless; + char invisible_cursor_bits[] = { 0x0 }; + + useless.red = useless.green = useless.blue = 0; + useless.pixel = 0; + + empty_bitmap = gdk_bitmap_create_from_data (window, + invisible_cursor_bits, + 1, 1); + + cursor = gdk_cursor_new_from_pixmap (empty_bitmap, + empty_bitmap, + &useless, + &useless, 0, 0); + + gdk_window_set_cursor (window, cursor); + + gdk_cursor_unref (cursor); + + g_object_unref (empty_bitmap); +} + +static void +gtk_text_view_obscure_mouse_cursor (GtkTextView *text_view) +{ + if (text_view->mouse_cursor_obscured) + return; + + set_invisible_cursor (text_view->text_window->bin_window); + + text_view->mouse_cursor_obscured = TRUE; +} + /* * Events */ @@ -3620,6 +3659,7 @@ static gint gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) { gboolean retval = FALSE; + gboolean obscure = FALSE; GtkTextView *text_view = GTK_TEXT_VIEW (widget); GtkTextMark *insert; GtkTextIter iter; @@ -3634,6 +3674,7 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) gtk_im_context_filter_keypress (text_view->im_context, event)) { text_view->need_im_reset = TRUE; + obscure = TRUE; retval = TRUE; } else if (GTK_WIDGET_CLASS (parent_class)->key_press_event && @@ -3643,6 +3684,8 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) event->keyval == GDK_KP_Enter) { gtk_text_view_commit_text (text_view, "\n"); + + obscure = TRUE; retval = TRUE; } /* Pass through Tab as literal tab, unless Control is held down */ @@ -3653,7 +3696,10 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) { /* If the text isn't editable, move the focus instead */ if (text_view->editable) - gtk_text_view_commit_text (text_view, "\t"); + { + gtk_text_view_commit_text (text_view, "\t"); + obscure = TRUE; + } else gtk_text_view_move_focus (text_view, (event->state & GDK_SHIFT_MASK) ? @@ -3664,6 +3710,9 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event) else retval = FALSE; + if (obscure) + gtk_text_view_obscure_mouse_cursor (text_view); + gtk_text_view_pend_cursor_blink (text_view); return retval; @@ -3965,6 +4014,16 @@ gtk_text_view_motion_event (GtkWidget *widget, GdkEventMotion *event) { GtkTextView *text_view = GTK_TEXT_VIEW (widget); + if (text_view->mouse_cursor_obscured) + { + GdkCursor *cursor; + + cursor = gdk_cursor_new (GDK_XTERM); + gdk_window_set_cursor (text_view->text_window->bin_window, cursor); + gdk_cursor_unref (cursor); + text_view->mouse_cursor_obscured = FALSE; + } + if (event->window == text_view->text_window->bin_window && text_view->drag_start_x >= 0) { @@ -6425,7 +6484,7 @@ text_window_realize (GtkTextWindow *win, /* I-beam cursor */ cursor = gdk_cursor_new (GDK_XTERM); gdk_window_set_cursor (win->bin_window, cursor); - gdk_cursor_destroy (cursor); + gdk_cursor_unref (cursor); gtk_im_context_set_client_window (GTK_TEXT_VIEW (win->widget)->im_context, win->window); diff --git a/gtk/gtktextview.h b/gtk/gtktextview.h index df8abe7802..c30c54f7b9 100644 --- a/gtk/gtktextview.h +++ b/gtk/gtktextview.h @@ -100,6 +100,8 @@ struct _GtkTextView * last "invalidate" signal from the layout */ guint onscreen_validated : 1; + + guint mouse_cursor_obscured : 1; GtkTextWindow *text_window; GtkTextWindow *left_window; -- 2.30.2